package com.shuda.common.result;

import io.swagger.v3.oas.annotations.media.Schema;

/**
 * 统一响应结果类：移除Lombok，显式提供访问器，保证外部调用兼容性。
 */
@Schema(description = "统一响应结果")
public class Result<T> {

    @Schema(description = "响应码")
    private Integer code;

    @Schema(description = "响应消息")
    private String message;

    @Schema(description = "响应数据")
    private T data;

    public Result() {
    }

    /**
     *
     * 成功响应（无数据）
     * @param $params$
     * @return Result<Void>
     * @author ink
     * @Description: 提供无数据的成功响应，统一默认消息
     * @date 2025-11-09 23:28
     */
    public static <T> Result<T> success() {
        return new Result<>(200, "操作成功", null);
    }

    /**
     *
     * 成功响应（带数据）
     * @param data 响应数据
     * @return Result<T>
     * @author ink
     * @Description: 提供带数据的成功响应，统一默认消息
     * @date 2025-11-09 23:28
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(200, "操作成功", data);
    }

    /**
     * 参数错误响应
     * @param message 错误信息
     * @return Result<T>
     * @author ink
     * @Description: 用于参数校验失败场景统一返回
     * @date 2025-11-09 10:05
     */
    public static <T> Result<T> paramError(String message) {
        return new Result<>(400, message, null);
    }

    /**
     * 未认证响应
     * @param message 描述信息
     * @return Result<T>
     */
    public static <T> Result<T> unauthorized(String message) {
        return new Result<>(401, message, null);
    }

    /**
     * 拒绝访问响应
     * @param message 描述信息
     * @return Result<T>
     */
    public static <T> Result<T> forbidden(String message) {
        return new Result<>(403, message, null);
    }

    public Result(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 成功响应，自定义消息
     */
    public static <T> Result<T> success(String message, T data) {
        return new Result<>(200, message, data);
    }

    /**
     * 错误响应
     */
    public static <T> Result<T> error(String message) {
        return new Result<>(500, message, null);
    }

    /**
     * 错误响应，自定义状态码
     */
    public static <T> Result<T> error(Integer code, String message) {
        return new Result<>(code, message, null);
    }

    /**
     * 错误响应，带数据
     */
    public static <T> Result<T> error(String message, T data) {
        return new Result<>(500, message, data);
    }

    /**
     *
     * failed
     * @param message 错误信息
     * @return Result<T>
     * @author ink
     * @Description: 统一的失败响应静态方法，兼容现有调用
     * @date 2025-11-09 23:40
     */
    public static <T> Result<T> failed(String message) {
        return new Result<>(500, message, null);
    }

    /**
     * 获取响应码
     * @return Integer 响应码
     * @author ink
     * @Description: 明确返回响应码
     * @date 2025-11-09 10:00
     */
    public Integer getCode() {
        return code;
    }

    /**
     * 设置响应码
     * @param code 响应码
     * @return void
     * @author ink
     * @Description: 允许外部设置响应码（如认证失败场景）
     * @date 2025-11-09 10:00
     */
    public void setCode(Integer code) {
        this.code = code;
    }

    /**
     * 获取响应消息
     * @return String 响应消息
     */
    public String getMessage() {
        return message;
    }

    /**
     * 设置响应消息
     * @param message 响应消息
     */
    public void setMessage(String message) {
        this.message = message;
    }

    /**
     * 获取响应数据
     * @return T 响应数据
     */
    public T getData() {
        return data;
    }

    /**
     * 设置响应数据
     * @param data 响应数据
     */
    public void setData(T data) {
        this.data = data;
    }
}